#include <iostream>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>

void handler(int sig)
{
    while(1)
    {
        //非阻塞轮询，允许父进程回首多个子进程
        int n = waitpid(-1, nullptr, WNOHANG);
        if(n == 0)
        {
            break;
        }
        else if(n < 0)
        {
            std::cout << "waitpid error" << std::endl;
            break;
        }
    }
    std::cout << "father got a signal" << sig << std::endl;
}

int main()
{
    //子进程在推出的时候会给父进程发送SIGCHLD信号
    //这样子进程就会自动被回收，不会产生僵尸进程，不需要信号捕捉
    signal(SIGCHLD, SIG_IGN);
    for(int i = 0; i < 10; i++)
    {
        pid_t id = fork();
        if(id == 0)
        {
            std::cout << "I am a child:" << getpid() << std::endl;
            sleep(3);
            exit(3);
        }
    }

            while(1)
            {
                std::cout << "I am father, waiting" << std::endl;
                sleep(1);
            }
    return 0;
}

// int main()
// {
//     volatile const int a = 0;
//     int* pa = (int*)&a;
//     (*pa)++;
//     std::cout << *pa << std::endl;
//     std::cout << a << std::endl;
//     return 0;
// }

// volatile int flag = 0;//告诉编译器不能只从寄存器中读取，也要在内存中占据一块空间，还要读取这里的值

// void handler(int sig)
// {
//     std::cout << "更改全局变量" << flag  << "-> 1" << std::endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2, handler);
//     while(!flag) 
//     //cpu中有两种运算：算数运算和逻辑运算，两者都需要寄存器从内存中读取数据
//     //为了节省时间，cpu可能会让这个值在内存中和寄存器中都有，但是之读取寄存器中的
//     {
//         std::cout << "process quit" << std::endl;
//     }
//     return 0;
// }